<?php   // $Id: update.php 347 2012-05-07 09:11:55Z pcoustillas $ ?>
<?php //fichier permettant d'effectuer les mises a jour d'openDCF

// Explication detaillée :
// pierre 08/02/2007 :
/*
explication fonctionnel :
Sur le serveur de mise à jour se trouve un fichier XML gerer par l'admin (moi ;-) )
a l'ouverture de ce fichier, update.php parcours recursivement tout les fichiers pour creer un xml 
Les deux xml contiennent tous les fichiers php ainsi que leur numero de version.
Il ne reste plus qu'a comparer les differences et a proposer des actions en consequence : 
	MAJ ; mise a jour (la version du serveur est plus eleve)
	DEL : DELETE suppresion (sur le serveur ce fichier n'existe pas)
	NOU : NO UPDATE , la mise a jour n'est pas proposer soit par ce que la chaine "NO UPDATE" est present dans les 100 premier
			caracteres ,soient parce que la version du client est superieur a la version du serveur.
	


explication technique :
le fichier du serveur s'appelle openDCF_srv.diff
celui du client creer a la volé openDCF_cli



*/

require_once("include/verif.php");
require_once("include/utils.php");
require_once("include/headers.php");


$server_maj="http://opendcf.1g6.biz";


//Le formulaire à ete posté, donc le client desire une action de maj
if (isset($_POST['submit'])) {
	//on boucle sur tout les champs postés
	foreach ($_POST as $champ => $valeur) {
		//on detecte si c'est un champ "case à cocher"
		if ( substr($champ,0,7) == "chkchk_") {
			//on recupere le nom du fic et l'action à effectuer
			$fic=substr($champ,11);
			$action=$_POST[$fic];
			
			$fic=str_replace("_2E_",".",$fic);
			$fic=str_replace("_2F_","/",$fic);
			//echo "<br/> &nbsp; ". $fic . " " . $action ." <br/>";
		
			//traitement particulier pour config.xml -- parceque c'est un xml			
			if ($fic != "include/config.xml")
			{
				if ($action=="MAJ" || $action=="DEL") 
				{
					//echo "suppression de $fic";
					//une mise à jour c'est en faite une suppression + ajout
					unlink($fic); //suppression du fichier
					
				}

				if ($action=="MAJ" || $action=="NEW")
				{

					//vérifier si le repertoire de ce fichier existe
					if (dir(dirname($fic)) == 0)
					{
						//echo dirname($fic) . "n'existe pas";
						mkdir(dirname($fic));
					}

					//on dowload le fichier
					//echo "&nbsp; download de $fic <br/>";
					$fp = fopen($fic, "w");
					$curl = curl_init("$server_maj/openDCF_maj/$fic");
					curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
					curl_setopt($curl, CURLOPT_USERAGENT,"Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.8.0.1) Gecko/20060111 Firefox/2.0 ");
					curl_setopt($curl, CURLOPT_HEADER, 0);
					curl_setopt($curl, CURLOPT_FILE, $fp);
					curl_exec($curl);
					fclose($fp);
					//$fic_diff_cli->$fic=$fic_diff_srv->$fic;
				}

			} else { //il s'agit d'une mise à jour de config.xml 
				
				//recuperation du fichier config.xml du serveur
				$curl = curl_init("$server_maj/openDCF_maj/include/config.xml");
				curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
				curl_setopt($curl, CURLOPT_USERAGENT,"Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.8.0.1) Gecko/20060111 Firefox/2.0 ");
				$fp = fopen("include/config.xml.srv", "w");
				curl_setopt($curl, CURLOPT_FILE, $fp);
				curl_setopt($curl, CURLOPT_HEADER, 0);
				curl_exec($curl);
				curl_close($curl);
				fclose($fp);


				$config_cli = simplexml_load_file("include/config.xml"); //cette variable contient la version des fichiers du client.
				$config_srv = simplexml_load_file("include/config.xml.srv"); //cette variable contient la version des fichiers du serveur.
				$modif=0; //drapeau afin de savoir si on a jouter ou retirer une balsie au client

				//cette premiere boucle sert a determiner les balises manquante sur le fichier de config du client
				foreach ($config_srv->children() as $domaine => $rien)
				{
					
					foreach ($config_srv->$domaine->children() as $conf => $valeur_conf)
					{	
						//echo "$domaine --> $conf=$valeur_conf<br/>";
						if (!isset($config_cli->$domaine->$conf)) //la balise n'existe sur le client
						{
							// on ajoute la balise

							$att=$config_srv->$domaine->$conf->attributes();
							$config_cli->$domaine->$conf="$valeur_conf";
							$config_cli->$domaine->$conf->addAttribute('desc',$att['desc']);
							$config_cli->$domaine->$conf->addAttribute('type',$att['type']);
							if (isset($att['valeur']))
							{
								$config_cli->$domaine->$conf->addAttribute('valeur',$att['valeur']);
							}
							$modif=1;
						}
					}
				}

				//si detection d'une balise manquante alors on sauvegarde le fichier
				$config_cli->asXML("include/config.xml");

                foreach ($config_cli->children() as $domaine => $rien)
                {

                    foreach ($config_cli->$domaine->children() as $conf => $valeur_conf)
                    {
                        if (!isset($config_srv->$domaine->$conf)) //la balise n'existe plus sur le server
                        {
                            // on retire la balise
                            unset($config_cli->$domaine->$conf);
                        }
                    }

                }

				$config_cli->asXML("include/config.xml");

				//a présent on change la 2eme ligne du fichier qui contient le numéro de version et la date.
				//<!-- $Id: update.php 347 2012-05-07 09:11:55Z pcoustillas $ -->
				$config_srv=file_get_contents("include/config.xml.srv",FALSE,NULL,0,100);
				//echo $config_srv;

				$config_srv=str_replace("\n"," ",$config_srv);
				$config_srv_vrs=preg_replace("/.*config.xml ([0-9]+) 20.*/","$1",$config_srv);
				$config_srv_date=preg_replace("/.*[0-9]+ (20[0-9][0-9]-[0-9][0-9]-[0-9][0-9]).*/","$1",$config_srv);

				//echo "config_srv_vrs=$config_srv_vrs\n";
				//echo "config_srv_date=$config_srv_date\n";

				$config_cli=file_get_contents("include/config.xml");
				$config_cli=preg_replace("/config.xml [0-9]+ 20/","config.xml $config_srv_vrs 20",$config_cli);
				$config_cli=preg_replace("/config.xml ([0-9]+) 20[0-9][0-9]-[0-9][0-9]-[0-9][0-9]/","config.xml $1 $config_srv_date",$config_cli);

				file_put_contents("include/config.xml",$config_cli);

				//echo "config_cli=$config_cli";

				//supression de cenfig.xml.srv
				unlink("include/config.xml.srv");

			} // fin de soit config.xml soit autre chose
			
		} //fin de si c'est un champ "case à cocher"

	} // fin de boucle sur tout les champs postés

	//$fic_diff_cli->asXML("openDCF.diff");

} // fin de le formualaire à été posté




function recursive_display($path) {
//cette boucle parcours recursivement les fichiers de votre openDCF et creer un XML des versions des fichiers
	$O = dir($path);
	if(!is_object($O)) return false;
	global $xmlstr; //var global car la fonction est recursive
	

	while($file = $O -> read()) {
		$fic=$path.'/'.$file;
		if($file != '.' && $file != '..') {
			if(is_file($fic)) {
				if (!strstr($fic,"dump/") && !strstr($fic,"CVS") && !strstr($fic,".svn") && !strstr($fic,".diff") && !strstr($fic,"config/common.php") && !strstr($fic,"config/var.php") && !strstr($fic,"~") && !strstr($fic,".htaccess") && !strstr($fic,"image/") && !strstr($fic,"swp") && !strstr($fic,"htmlarea") && !strstr($fic,"sessions") && !strstr($fic," ")) {
					//pierre 08/02/07 : remarque de phil il a ajouter && !strstr($fic,"<openDCF>" . bizare c'est pas un nom de fichier normalement.
					$fic=substr($fic,2); //supprime le ./ en debut de chaque fic
					
					//chercher l'id de version dans les premiers carac du fichier :
					$prems_car=file_get_contents($fic,FALSE,NULL,0,80);
					$prems_car=str_replace("\n"," ",$prems_car);
					//echo "$fic $prems_car <br/><br/><br/>";
					//echo "<pre>$fic=$prems_car <br/></pre>";
					if (strstr($prems_car,"NO UPDATE")) { //si NO UPDATE dans le fichier
							$version=9999; //valeur tres grande pour ne pas proposer la mise à jour
					} else {
							//echo "TOTO" . $prems_car . "TITI";
							//$pos=strpos($prems_car," Id"); //apres ",v " ce trouve le numero de version
							if (preg_match('/ [0-9]+ /',$prems_car) > 0) {
								$version=preg_replace('/.* ([0-9]+) .*/',"$1",$prems_car);
								$date=preg_replace('/.*[0-9] ([0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]) [0-9][0-9]:.*/',"$1",$prems_car);
								$tab_date=preg_split("/-/",$date);
								$date=$tab_date[2] . "/" . $tab_date[1] . "/" . $tab_date[0];
							} else {
								$version="1"; //si on trouve pas de version on met la valeur minimum
								$date="";
							}

					}

					$fic=str_replace("/","_2F_",$fic); //remplace le / qui pose probleme en XML par _2F_ (code ascii)
					$xmlstr.="<$fic date='$date'>$version</$fic>\n"; //place la version touvée sur chaque fichier trouve

				}
			} else {
				if(is_dir($fic)) recursive_display($fic);
			}
		}
	}

	$O -> close();

}





////// Creation du fichier openDCF.diff /////
$xmlstr="<openDCF>\n";
$xmlstr.=recursive_display(".");
$xmlstr.="</openDCF>";
//print_r($xmlstr);
$xml = new SimpleXMLElement($xmlstr);

$xml->asXML('openDCF.diff');
////// Fin de creation de openDCF.diff //////


echo "<br/>";

//recuperation du fichier openDCF.diff du serveur
$curl = curl_init("$server_maj/openDCF_maj/openDCF.diff");
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_USERAGENT,"Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.8.0.1) Gecko/20060111 Firefox/2.0 ");
$fp = fopen("openDCF_srv.diff", "w");
curl_setopt($curl, CURLOPT_FILE, $fp);
curl_setopt($curl, CURLOPT_HEADER, 0);
curl_exec($curl);
curl_close($curl);
fclose($fp);


//On charge les XML necessaire
$fic_diff_cli = simplexml_load_file("openDCF.diff"); //cette variable contient la version des fichiers du client.
$fic_diff_srv = simplexml_load_file("openDCF_srv.diff"); //cette variable contient la version des fichiers du serveur.
//$fic_a_sauver = simplexml_load_file("openDCF.diff"); // cette variable va contenir la version des fichiers que le client a choisi.



?>

<script type="text/javascript">
function cocher(action)
{
	str="";
	for (champ in document.forms['maj_opendcf'])
	{
		if (champ.substr(0,7)=="chkchk_")
		{
			if ((action==champ.substr(7,3)) || (action == "ALL"))  
			{
				//alert(champ);
				if ( document.forms['maj_opendcf'].elements[champ].checked == false)
					 document.forms['maj_opendcf'].elements[champ].checked= true
				else
					 document.forms['maj_opendcf'].elements[champ].checked = false
				
			} 

		}
	}
//alert(str);

}


</script>

<table width="760" class="page" align="center">
	<tr>
		<td class="page" align="center">
			<?php
			require_once("include/head.php");
			?>
		</td>
	</tr>
	<tr>
		<td>
			<center><?php bouton_aide("update") ?></center>
			<br/>
		</td>
	</tr>
	<tr>
		<td class="page" align="center">
			<center>

			<?php
			if (!extension_loaded('curl'))
			{
				aff_lang("Ce module n'est pas disponible car curl n'est pas installé sur votre système");
				
				echo "</td></tr></table></body></html>";
				exit;
			}
			?>

			<form name="maj_opendcf" method="post" action="update.php" >
			<table border="0" class="boiteaction">
			<tr>
				<td colspan="4">
					<center><input type="submit" value="<?php aff_lang("Effectuer les actions sélectionnées") ?>" /></center>
				</td>
				<td colspan="4">
					<input type="button" value="MAJ" onclick="cocher('MAJ')" />
					<input type="button" value="NEW" onclick="cocher('NEW')" />
					<input type="button" value="DEL" onclick="cocher('DEL')" />
					<input type="button" value="ALL" onclick="cocher('ALL')" />
				</td>
			</tr>
			<tr>
				<th>&nbsp;</th>
				<th colspan="3">Mise à jour</th>
				<th colspan="2">Votre version</th>
				<th>&nbsp;</th>
				<th>&nbsp;</th>
				<th>&nbsp;</th>
				<th>&nbsp;</th>
			</tr>
			<tr>
				<th>Fichier</th>
				<th>Numéro</th>
				<th>date</th>
				<th>Depuis</th>
				<th>Numéro</th>
				<th>date</th>
				<th>Action</th>
				<th>Action</th>
				<th>Source</th>
				<th>&nbsp;</th>
			</tr>
			<?php  
			//cette premiere boucle sert a determiner les differences de numero de version
			foreach ($fic_diff_srv->children() as $fic => $version_srv)
			{
				$fic_avec_slash=str_replace("_2F_","/",$fic);
				if ($fic_avec_slash != "error.log")
				{
					if (isset($fic_diff_cli->$fic)) //le fichier existe sur le client
					{
						if ((double)$version_srv > (double)$fic_diff_cli->$fic) 
						{
							$action="MAJ";$txt_action="Mise à jour disponible";
						} else {
							if ((double)$version_srv == (double)$fic_diff_cli->$fic) 
							{
								$action="RAS";$txt_action="Rien à faire";
							} else {
								//la version du client est superieur au serveur
								$action="NOU"; $txt_action="Mise à jour non désiré"; //NO UPDATE
							}
						}
	
					} else { //le fichier n'existe pas proposition de mise à jour
						$action="NEW";$txt_action="Nouveau fichier";
					}
	
					if ($action=="NEW" || $action=="MAJ" || $action=="NOU")
					{
							$tmp=$fic_diff_cli->$fic;
							$date_cli=$tmp['date'];
							$date_srv=$version_srv['date'];
							if ($date_srv != "")
							{
								$tDeb = explode("/", $date_srv);
								$tFin = explode("/", date("d/m/Y"));
								$diff = mktime(0, 0, 0, $tFin[1], $tFin[0], $tFin[2]) - 
											mktime(0, 0, 0, $tDeb[1], $tDeb[0], $tDeb[2]);
							
								$old=round($diff / 86400) . " jours"; 
							} else {
								$old="";
							}
						echo "<tr style='height:20px'>";
							echo "<td>$fic_avec_slash </td>";
							echo "<td style='text-align:center'>$version_srv</td>";
							echo "<td style='text-align:center'>$date_srv</td>";
							echo "<td style='text-align:left'><b>$old</b>&nbsp; &nbsp;</td>\n";
							echo "<td style='text-align:center'>" . $fic_diff_cli->$fic ." </td>";
							echo "<td style='text-align:center'>$date_cli</td>";

							echo "<td style='text-align:center'>$action </td>";
							echo "<td style='text-align:center'>$txt_action </td>";
							echo "<td><center><a target='top' href=\"$server_maj/openDCF_maj/$fic_avec_slash\">Source</a></center></td>";
	
							if ($action != "NOU") 
							{
								$fic_sans_point=str_replace(".","_2E_",$fic);
								echo "<td><input type=checkbox name='chkchk_${action}_" . $fic_sans_point . "' /></td>";
								echo "<input type='hidden' name='$fic_sans_point' value='$action' />"; 	
							} else {
								echo "<td> &nbsp; </td>";
							}
						echo "</tr>";
					}

				} //fic différent de error.log

			}

			// cette deuxieme boucle sert determiner les fichiers du client non present sur le serveur
			foreach ($fic_diff_cli->children() as $fic => $version_cli)
			{
				$fic_avec_slash=str_replace("_2F_","/",$fic);
				if (!isset($fic_diff_srv->$fic))
				{
					if ($fic_diff_cli->$fic <> 9999) // 9999 est la valeur de NO UPDATE
					{
						$action="DEL";$txt_action="Suppression";
						echo "<tr style='height:20px'>";
							echo "<td>$fic_avec_slash</td>\n";
							echo "<td colspan='3'>&nbsp;</td>\n"; //pas de version serveur, le fic n'existe plus

							echo "<td style='text-align:center'>"  . $fic_diff_cli->$fic . "</td>\n";
							echo "<td>&nbsp; </td>\n";

							echo "<td style='text-align:center'>$action </td>";
							echo "<td style='text-align:center'>$txt_action </td>";
							$fic_sans_point=str_replace(".","_2E_",$fic);
							echo "<td>
									<center><a href=\"$server_maj/openDCF_maj/$fic_avec_slash\">Source</a></center>
									<input type='hidden' name='$fic_sans_point' value='$action' />\n
									</td>";
							echo "<td><input type='checkbox' name='chkchk_${action}_" . $fic_sans_point . "' /></td>\n";
						echo "</tr>";
					}
				}
				
			}


			?>
			<tr>
				<td colspan="4">
					<input type="hidden" name="submit" />
					<center><input type="submit" value="<?php aff_lang("Effectuer les actions sélectionnées") ?>" /></center>
				</td>
				<td colspan="4"> &nbsp; </td>
			</tr>
			</table>
			</form>
			</center>
		</td>
	</tr>
</table>

</body>
</html>
